package org.example.manySheetExcel;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.servlet.ServletOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * @author 望轩
 * @createDate 2025/8/20 17:31
 */
public class ExportExcelDataWithManySheetExample {
    public static void main(String[] args) {
        //这里是多个树的根节点，每个根节点的children属性是它的子节点；我们这里有多少颗树需要在excel文件中创建多少sheet工作簿
        //因此后续循环创建sheet工作簿的时候，一定会遍历regionRootNodeList集合
        List<RegionVo> regionRootNodeList = gainRegionRootNodeList();

        Workbook workbook = null;
        try {
            workbook = new XSSFWorkbook();
            // 创建表头样式（黄色背景，居中）
            CellStyle headerStyle = createHeaderStyle(workbook);
            // 创建数据样式（居中，自动换行）
            CellStyle dataStyle = createDataStyle(workbook);

            // 根据集合数量创建对应数量的Sheet，并分别填充数据；一个分区国家树形结构对应一个sheet
            int i = 1;
            for (RegionVo regionRootNode : regionRootNodeList) {
                List<RegionVo> children = regionRootNode.getChildren();
                List<RegionDTO> childrenAndParentData = convertVOToDTO(children);
                createSheet(workbook, "分区数据" + i, childrenAndParentData, headerStyle, dataStyle);
                i++;
            }

            FileOutputStream fileOut = new FileOutputStream("D:/用户信息.xlsx");
            workbook.write(fileOut);

            //上面是把excel文件直接输出到本地文件夹中，我们也可以把excel文件数据作为流返回给调用我们的客户端，这种是通过response
            //对象来实现的，需要控制器中把Response对象带过来，这里我们就先不做研究了，到时候做项目的时候可以参照前人的代码或者去ai
        } catch (Exception e) {
            throw new RuntimeException(e);
        } finally {
            try {
                workbook.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    private static List<RegionDTO> convertVOToDTO(List<RegionVo> children) {
        List<RegionDTO> childrenAndParentData = new ArrayList<>();
        return childrenAndParentData;
    }

    private static List<RegionVo> gainRegionRootNodeList() {
        return new ArrayList<>();
    }

    // 创建表头样式（黄色背景，居中）
    private static CellStyle createHeaderStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置黄色背景
        style.setFillForegroundColor(IndexedColors.YELLOW.getIndex());
        style.setFillPattern(FillPatternType.SOLID_FOREGROUND);

        // 设置居中（水平和垂直）
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        // 设置字体（加粗）
        Font font = workbook.createFont();
        font.setBold(true);
        style.setFont(font);

        // 设置细边框
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);

        return style;
    }

    // 创建数据样式（居中，自动换行）
    private static CellStyle createDataStyle(Workbook workbook) {
        CellStyle style = workbook.createCellStyle();
        // 设置居中（水平和垂直）
        style.setAlignment(HorizontalAlignment.CENTER);
        style.setVerticalAlignment(VerticalAlignment.CENTER);

        // 设置自动换行（实现行高自适应）
        style.setWrapText(true);

        // 设置细边框
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);

        return style;
    }

    // 创建Sheet并填充数据
    private static void createSheet(Workbook workbook, String sheetName,
                                    List<RegionDTO> data,
                                    CellStyle headerStyle, CellStyle dataStyle) {
        Sheet sheet = workbook.createSheet(sheetName);

        // 创建表头行（黄色背景）
        Row headerRow = sheet.createRow(0);
        String[] headers = {"Name", "NameCn", "Code", "RegionLevel", "Type"};
        for (int i = 0; i < headers.length; i++) {
            Cell cell = headerRow.createCell(i);
            cell.setCellValue(headers[i]);
            cell.setCellStyle(headerStyle);
        }

        // 填充数据行
        for (int i = 0; i < data.size(); i++) {
            RegionDTO dto = data.get(i);
            Row row = sheet.createRow(i + 1);

            // 填充单元格数据并应用样式
            createCell(row, 0, dto.getName(), dataStyle);
            createCell(row, 1, dto.getNameCn(), dataStyle);
            createCell(row, 2, dto.getCode() != null ? dto.getCode() : "", dataStyle);
            createCell(row, 3, String.valueOf(dto.getRegionLevel()), dataStyle);
            createCell(row, 4, dto.getType(), dataStyle);
        }

        // 自适应列宽（处理中文宽度问题）
        for (int i = 0; i < headers.length; i++) {
            sheet.autoSizeColumn(i);
            // 增加额外宽度以适配中文[7](@ref)
            int columnWidth = sheet.getColumnWidth(i);
            sheet.setColumnWidth(i, (int)(columnWidth * 1.3));
        }

        // 设置行高自适应[7](@ref)
        for (int i = 0; i <= sheet.getLastRowNum(); i++) {
            Row row = sheet.getRow(i);
            if (row != null) {
                row.setHeight((short)-1); // 启用自动行高
            }
        }
    }

    // 创建单元格辅助方法
    private static void createCell(Row row, int column, String value, CellStyle style) {
        Cell cell = row.createCell(column);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }

}
